home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 4 / FM Towns Free Software Collection 4 - Disc 1.iso / msdos / all_dir / vramput.c < prev    next >
C/C++ Source or Header  |  1991-10-18  |  2KB  |  100 lines

  1. /*
  2.  *  システム行への書き込みプログラム 1991 HIROSHI-NAKAMURA
  3.  *
  4.  *  使用法 SYSLINE メッセージ 属性(0カラ63) 表示開始桁(1カラ79) 表示行(1カラ25)
  5.  *
  6.  *  メッセージ 任意の文字列。ただし空白は使えません。
  7.  *  属性   0=黒 1=青 2=赤 3=紫 4=緑 5=水色 6=黄 7=白 及び 8=反転 32=高輝度
  8.  *         色 + 反転 + 高輝度 の合計数値で指定します。  
  9.  *  桁・行  画面左上を1行1桁として指定します。省略時はシステム行左端。
  10.  */
  11. #include    <string.h>
  12. #include    <dos.h>
  13. #include    <jctype.h>
  14. #include    <jstring.h>
  15. #include    <memory.h>
  16.  
  17. struct  SREGS   *segregs,*sregs  ;
  18.  
  19. printv(str,attr,x,y)     /* VRAM書き込み */
  20. unsigned char str[];     /* 文字列 */
  21. char attr ;              /* 属性 */
  22. int  x,y;                /* 桁、行 */
  23. {
  24.     int         len,i,code ;
  25.     static      unsigned  pos =0 ;
  26.     char        kan[2],attrib[2],pek[2];
  27.     unsigned    vramseg1=0xc800,vramseg2=0xca00 ;
  28.     
  29.     if (x < 0 || x >= 80 || y < 0 || y >= 25 )
  30.         return(-1);
  31.  
  32.     pos = (y * 80 + x) * 2;
  33.     len = strlen(str);
  34.     for (i=0;i<len;i++){
  35.         if( iskanji(str[i]) && iskanji2(str[i+1]) ){ /* 漢字 */
  36.             code = (int)jmstojis( str[i++]*0x100 +str[i+1] ) ;
  37.             kan[0]= ( code >> 8 );
  38.             kan[1]=  code & 0x00ff ;
  39.             attrib[0]=attr|0x0040 ;
  40.             poke (vramseg1,pos+1,attrib,1) ;
  41.             attrib[0]=attr ;
  42.             poke (vramseg1,pos+3,attrib,1) ;
  43.             poke (vramseg2,pos,kan,2) ;
  44.             pos +=4 ;
  45.         }
  46.         else{
  47.             if(str[i] =='\\' && str[i+1]=='n' ){
  48.                 pos = (pos / 80 + 1) *80;
  49.                 i++ ;
  50.             }
  51.             else if( str[i]=='\n' ){
  52.                 pos = (pos / 80 + 1) * 80 ;
  53.             }
  54.             else{
  55.                 peek (vramseg1,pos-1,pek,1) ;
  56.                 /*if((x%2) && (pek[0] & 0x40)){
  57.                     poke(vramseg1,pos-2," ",1);
  58.                     poke(vramseg1,pos-1,attrib,1);
  59.                 }*/
  60.                 kan[0]= str[i] ;
  61.                 kan[1]=   0 ;
  62.                 attrib[0]= attr ;
  63.                 poke (vramseg1,pos,kan,1) ;
  64.                 poke (vramseg1,pos+1,attrib,1) ;
  65.                 pos +=2 ;
  66.             }
  67.         }
  68.     }
  69.     return(len);
  70. }
  71. poke(seg,off,buff,siz)   /* メモリ書き込み */
  72. int  seg;                    
  73. int  off;
  74. char *buff ;
  75. unsigned siz;
  76. {
  77.     struct SREGS    s;
  78.  
  79.     segread(&s);
  80.     movedata(s.ds,(int)buff,seg,off,siz);
  81.     
  82.     return(0);
  83. }
  84.  
  85. peek(sseg,soff,dbuff,size)
  86. int sseg;
  87. int soff;
  88. char *dbuff ;
  89. unsigned size;
  90. {
  91. struct SREGS    s;
  92.  
  93.     segread(&s);
  94.     movedata(sseg,soff,s.ds,(int)dbuff,size);
  95.     
  96.     return(0);
  97. }
  98.  
  99.  
  100.